#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <vector>

typedef void (*handler_t)(); // 函数指针类型
std::vector<handler_t> handlers; // 函数指针数组

void fun_one() 
{
  printf("这是⼀个临时任务1\n");
}

void fun_two() 
{
  printf("这是⼀个临时任务2\n");
}

void Load() 
{
  handlers.push_back(fun_one);
  handlers.push_back(fun_two);
}

void handler() 
{
  if (handlers.empty())
    Load();
  for (auto iter : handlers)
    iter();
}

int main() 
{
  pid_t pid;
  pid = fork();

  if (pid < 0) 
  {
    printf("%s fork error\n", __FUNCTION__);
    return 1;
  } 
  else if (pid == 0) 
  { // child
    printf("child is run, pid is : %d\n", getpid());
    sleep(5);
    exit(1);
  } 
  else 
  {
    int status = 0;
    pid_t ret = 0;

    do 
    {
      ret = waitpid(-1, &status, WNOHANG); // ⾮阻塞式等待
      if (ret == 0) 
      {
        printf("child is running\n");
      }
      handler();
      }while (ret == 0);

  if (WIFEXITED(status) && ret == pid) 
  {
    printf("wait child 5s success, child return code is :%d.\n",
    WEXITSTATUS(status));
  } 
  else 
  {
    printf("wait child failed, return.\n");
    return 1;
  }

  return 0;
}
